Tratamento de dados da COVID-19¶

by: Atrylli Maria

  • Primeiro projeto individual de dados.
  • O primeiro dataframe contém dados retirados do site covid.saude.gov.br - os dados são do mês de Janeiro (2023) até a data 27-02-2023.
  • Foi utilizado um arquivo JSON contendo os estados brasileiros retirado do IBGE com as informações das localidades dos estados do Brasil.
  • Além disso, montei uma planilha manualmente que carrega os estados brasileiros, com latitude e longitude.

Esse projeto foi construído para colocar em prática meu conhecimento (básico) em análise de dados, ao longo do processo consultei vários artigos/posts que explicavam sobre boas práticas dentro da área e como realizar a manipulação dos dados.

In [2]:
# Bibliotecas utilizadas
import pandas as pd
import json
import folium
from branca.colormap import linear
import plotly.graph_objects as go
import plotly.express as px
from folium.plugins import MarkerCluster
from branca.element import Template, MacroElement
In [3]:
# Dataframes utilizados
df = pd.read_csv("HIST_PAINEL_COVIDBR_2023_Parte1_27fev2023.csv", sep=';', decimal=',')
estados_ibge = pd.read_csv("estados_POP2021_20221212.csv", sep=';')

Visualizando os dados no dataframe¶

In [4]:
df[:344]
Out[4]:
regiao estado municipio coduf codmun codRegiaoSaude nomeRegiaoSaude data semanaEpi populacaoTCU2019 casosAcumulado casosNovos obitosAcumulado obitosNovos Recuperadosnovos emAcompanhamentoNovos interior/metropolitana
0 Brasil NaN NaN 76 NaN NaN NaN 2023-01-01 1 210147125.0 36331281 0 693853 0 35006153.0 631275.0 NaN
1 Brasil NaN NaN 76 NaN NaN NaN 2023-01-02 1 210147125.0 36362366 31085 693981 128 35081933.0 586452.0 NaN
2 Brasil NaN NaN 76 NaN NaN NaN 2023-01-03 1 210147125.0 36390423 28057 694192 211 35147500.0 548731.0 NaN
3 Brasil NaN NaN 76 NaN NaN NaN 2023-01-04 1 210147125.0 36423138 32715 694411 219 35196324.0 532403.0 NaN
4 Brasil NaN NaN 76 NaN NaN NaN 2023-01-05 1 210147125.0 36450812 27674 694569 158 35225196.0 531047.0 NaN
... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
339 Norte PA NaN 15 NaN NaN NaN 2023-02-19 8 8602865.0 869319 7 19009 0 NaN NaN NaN
340 Norte PA NaN 15 NaN NaN NaN 2023-02-20 8 8602865.0 869371 52 19010 1 NaN NaN NaN
341 Norte PA NaN 15 NaN NaN NaN 2023-02-21 8 8602865.0 869380 9 19010 0 NaN NaN NaN
342 Norte PA NaN 15 NaN NaN NaN 2023-02-22 8 8602865.0 869385 5 19010 0 NaN NaN NaN
343 Norte PA NaN 15 NaN NaN NaN 2023-02-23 8 8602865.0 869551 166 19011 1 NaN NaN NaN

344 rows × 17 columns

In [5]:
# Mostra o tamanho do dataframe
len(df.index)
Out[5]:
325902
In [6]:
# Retorna a quantidade de linhas com informações dentro da coluna
df[df.columns].count()
Out[6]:
regiao                    325902
estado                    325844
municipio                 323060
coduf                     325902
codmun                    324278
codRegiaoSaude            323060
nomeRegiaoSaude           323060
data                      325902
semanaEpi                 325902
populacaoTCU2019          324684
casosAcumulado            325902
casosNovos                325902
obitosAcumulado           325902
obitosNovos               325902
Recuperadosnovos              58
emAcompanhamentoNovos         58
interior/metropolitana    323060
dtype: int64
In [7]:
# Excluindo coluna que não será utilizada
df.drop('interior/metropolitana', axis=1, inplace=True)
In [8]:
# Retorna True colunas que possuem valores vazios
df.isna().any()
Out[8]:
regiao                   False
estado                    True
municipio                 True
coduf                    False
codmun                    True
codRegiaoSaude            True
nomeRegiaoSaude           True
data                     False
semanaEpi                False
populacaoTCU2019          True
casosAcumulado           False
casosNovos               False
obitosAcumulado          False
obitosNovos              False
Recuperadosnovos          True
emAcompanhamentoNovos     True
dtype: bool
In [9]:
# Soma os valores vazios dentro de cada coluna
df.isna().sum()
Out[9]:
regiao                        0
estado                       58
municipio                  2842
coduf                         0
codmun                     1624
codRegiaoSaude             2842
nomeRegiaoSaude            2842
data                          0
semanaEpi                     0
populacaoTCU2019           1218
casosAcumulado                0
casosNovos                    0
obitosAcumulado               0
obitosNovos                   0
Recuperadosnovos         325844
emAcompanhamentoNovos    325844
dtype: int64
In [10]:
# Soma de valores duplicados dentro do dataframe
df.duplicated().sum()
Out[10]:
0
In [11]:
df.describe()
Out[11]:
coduf codmun codRegiaoSaude semanaEpi populacaoTCU2019 casosAcumulado casosNovos obitosAcumulado obitosNovos Recuperadosnovos emAcompanhamentoNovos
count 325902.000000 324278.00000 323060.000000 325902.000000 3.246840e+05 3.259020e+05 325902.000000 325902.000000 325902.000000 5.800000e+01 58.000000
mean 32.360384 325258.01413 32403.123698 4.655172 1.126190e+05 1.963460e+04 6.507622 371.963115 0.047435 3.578935e+07 289568.000000
std 9.873311 98535.17613 9836.356530 2.396493 2.935319e+06 5.097196e+05 1136.276533 9807.732450 24.966663 3.351955e+05 140641.253887
min 11.000000 110000.00000 11001.000000 1.000000 7.810000e+02 0.000000e+00 -295586.000000 0.000000 -6602.000000 3.500615e+07 122813.000000
25% 25.000000 251200.00000 25010.000000 3.000000 5.474000e+03 8.280000e+02 0.000000 11.000000 0.000000 3.554831e+07 175012.750000
50% 31.000000 314610.00000 31059.000000 5.000000 1.168900e+04 1.723000e+03 0.000000 25.000000 0.000000 3.587205e+07 232446.000000
75% 41.000000 411915.00000 41015.000000 7.000000 2.576200e+04 4.220000e+03 0.000000 63.000000 0.000000 3.607666e+07 387598.000000
max 76.000000 530010.00000 53001.000000 9.000000 2.101471e+08 3.703823e+07 295598.000000 699006.000000 6602.000000 3.621641e+07 631275.000000
In [12]:
df[df.estado.isnull() == False]
Out[12]:
regiao estado municipio coduf codmun codRegiaoSaude nomeRegiaoSaude data semanaEpi populacaoTCU2019 casosAcumulado casosNovos obitosAcumulado obitosNovos Recuperadosnovos emAcompanhamentoNovos
58 Norte RO NaN 11 NaN NaN NaN 2023-01-01 1 1777225.0 471673 0 7399 0 NaN NaN
59 Norte RO NaN 11 NaN NaN NaN 2023-01-02 1 1777225.0 472112 439 7400 1 NaN NaN
60 Norte RO NaN 11 NaN NaN NaN 2023-01-03 1 1777225.0 472459 347 7401 1 NaN NaN
61 Norte RO NaN 11 NaN NaN NaN 2023-01-04 1 1777225.0 473198 739 7404 3 NaN NaN
62 Norte RO NaN 11 NaN NaN NaN 2023-01-05 1 1777225.0 473724 526 7406 2 NaN NaN
... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
325897 Centro-Oeste DF Brasília 53 530010.0 53001.0 DISTRITO FEDERAL 2023-02-23 8 3015268.0 896716 659 11843 0 NaN NaN
325898 Centro-Oeste DF Brasília 53 530010.0 53001.0 DISTRITO FEDERAL 2023-02-24 8 3015268.0 896808 92 11843 0 NaN NaN
325899 Centro-Oeste DF Brasília 53 530010.0 53001.0 DISTRITO FEDERAL 2023-02-25 8 3015268.0 896808 0 11843 0 NaN NaN
325900 Centro-Oeste DF Brasília 53 530010.0 53001.0 DISTRITO FEDERAL 2023-02-26 9 3015268.0 896808 0 11843 0 NaN NaN
325901 Centro-Oeste DF Brasília 53 530010.0 53001.0 DISTRITO FEDERAL 2023-02-27 9 3015268.0 897058 250 11843 0 NaN NaN

325844 rows × 16 columns

Criando agrupamentos entre as colunas¶

In [13]:
# Pega os valores máximos de obitos acumulados por cada estado
obitosAc = df.groupby(['estado'])['obitosAcumulado'].max()
obitosAc
Out[13]:
estado
AC      2043
AL      7242
AM     14433
AP      2167
BA     31451
CE     28114
DF     11843
ES     15039
GO     28026
MA     11051
MG     65471
MS     11004
MT     15087
PA     19014
PB     10541
PE     22680
PI      8354
PR     46004
RJ     76817
RN      8715
RO      7430
RR      2180
RS     41908
SC     22701
SE      6502
SP    178957
TO      4232
Name: obitosAcumulado, dtype: int64
In [14]:
# Retornar os valores máximos de casos acumulados por estado
casosAc = df.groupby(['estado'])['casosAcumulado'].max()
casosAc 
Out[14]:
estado
AC     160386
AL     337444
AM     630494
AP     185457
BA    1791455
CE    1452395
DF     897058
ES    1322373
GO    1895082
MA     493170
MG    4190922
MS     606906
MT     878360
PA     870136
PB     707617
PE    1154492
PI     424866
PR    2916967
RJ    2745792
RN     585806
RO     482654
RR     182282
RS    2959192
SC    1983986
SE     359644
SP    6457756
TO     365538
Name: casosAcumulado, dtype: int64
In [15]:
# Essa tabela foi construída bem depois, para realizar algumas introduções na visualização do mapa (os últimos gráficos)
covid = pd.merge(estados_ibge, casosAc, how='inner', on='estado')
covid = pd.merge(covid, obitosAc, how='inner', on='estado')
covid
Out[15]:
nome estado populacao latitude longitude casosAcumulado obitosAcumulado
0 Rondônia RO 1815278 -10.83 -63.34 482654 7430
1 Acre AC 906876 -8.77 -70.55 160386 2043
2 Amazonas AM 4269995 -3.47 -65.10 630494 14433
3 Roraima RR 652713 1.99 -61.33 182282 2180
4 Pará PA 8777124 -3.79 -52.48 870136 19014
5 Amapá AP 877613 1.41 -51.77 185457 2167
6 Tocantins TO 1607363 -9.46 -48.26 365538 4232
7 Maranhão MA 7153262 -5.42 -45.44 493170 11051
8 Piauí PI 3289290 -6.60 -42.28 424866 8354
9 Ceará CE 9240580 -5.20 -39.53 1452395 28114
10 Rio Grande do Norte RN 3560903 -5.81 -36.59 585806 8715
11 Paraíba PB 4059905 -7.28 -36.72 707617 10541
12 Pernambuco PE 9674793 -8.38 -37.86 1154492 22680
13 Alagoas AL 3365351 -9.62 -36.82 337444 7242
14 Sergipe SE 2338474 -10.57 -37.45 359644 6502
15 Bahia BA 14985284 -13.29 -41.71 1791455 31451
16 Minas Gerais MG 21411923 -18.10 -44.38 4190922 65471
17 Espírito Santo ES 4108508 -19.19 -40.34 1322373 15039
18 Rio de Janeiro RJ 17463349 -22.25 -42.66 2745792 76817
19 São Paulo SP 46649132 -22.19 -48.79 6457756 178957
20 Paraná PR 11597484 -24.89 -51.55 2916967 46004
21 Santa Catarina SC 7338473 -27.45 -50.95 1983986 22701
22 Rio Grande do Sul RS 11466630 -30.17 -53.50 2959192 41908
23 Mato Grosso do Sul MS 2839188 -20.51 -54.54 606906 11004
24 Mato Grosso MT 3567234 -12.64 -55.42 878360 15087
25 Goiás GO 7206589 -15.98 -49.86 1895082 28026
26 Distrito Federal DF 3094325 -15.83 -47.86 897058 11843
In [16]:
# Algumas colunas introduzidas dentro do dataframe Covid
# Calculo da porcentagem de casos acumulados para a quantidade de população de cada estado
covid['perc_casos'] = covid['casosAcumulado']/covid['populacao']*100
# Calculo de porcentagem de obitos acumulados para cada caso acumulado
covid['perc_obitos'] = covid['obitosAcumulado']/covid['casosAcumulado']*100

covid
Out[16]:
nome estado populacao latitude longitude casosAcumulado obitosAcumulado perc_casos perc_obitos
0 Rondônia RO 1815278 -10.83 -63.34 482654 7430 26.588434 1.539405
1 Acre AC 906876 -8.77 -70.55 160386 2043 17.685549 1.273802
2 Amazonas AM 4269995 -3.47 -65.10 630494 14433 14.765685 2.289157
3 Roraima RR 652713 1.99 -61.33 182282 2180 27.926822 1.195949
4 Pará PA 8777124 -3.79 -52.48 870136 19014 9.913680 2.185176
5 Amapá AP 877613 1.41 -51.77 185457 2167 21.131980 1.168465
6 Tocantins TO 1607363 -9.46 -48.26 365538 4232 22.741472 1.157746
7 Maranhão MA 7153262 -5.42 -45.44 493170 11051 6.894337 2.240809
8 Piauí PI 3289290 -6.60 -42.28 424866 8354 12.916648 1.966267
9 Ceará CE 9240580 -5.20 -39.53 1452395 28114 15.717574 1.935699
10 Rio Grande do Norte RN 3560903 -5.81 -36.59 585806 8715 16.451052 1.487694
11 Paraíba PB 4059905 -7.28 -36.72 707617 10541 17.429398 1.489648
12 Pernambuco PE 9674793 -8.38 -37.86 1154492 22680 11.932989 1.964500
13 Alagoas AL 3365351 -9.62 -36.82 337444 7242 10.027008 2.146134
14 Sergipe SE 2338474 -10.57 -37.45 359644 6502 15.379431 1.807899
15 Bahia BA 14985284 -13.29 -41.71 1791455 31451 11.954762 1.755612
16 Minas Gerais MG 21411923 -18.10 -44.38 4190922 65471 19.572843 1.562210
17 Espírito Santo ES 4108508 -19.19 -40.34 1322373 15039 32.186210 1.137274
18 Rio de Janeiro RJ 17463349 -22.25 -42.66 2745792 76817 15.723170 2.797626
19 São Paulo SP 46649132 -22.19 -48.79 6457756 178957 13.843250 2.771195
20 Paraná PR 11597484 -24.89 -51.55 2916967 46004 25.151723 1.577118
21 Santa Catarina SC 7338473 -27.45 -50.95 1983986 22701 27.035406 1.144212
22 Rio Grande do Sul RS 11466630 -30.17 -53.50 2959192 41908 25.806989 1.416197
23 Mato Grosso do Sul MS 2839188 -20.51 -54.54 606906 11004 21.376041 1.813131
24 Mato Grosso MT 3567234 -12.64 -55.42 878360 15087 24.622999 1.717633
25 Goiás GO 7206589 -15.98 -49.86 1895082 28026 26.296518 1.478881
26 Distrito Federal DF 3094325 -15.83 -47.86 897058 11843 28.990426 1.320204

Ordenando algumas colunas em ordem Decrescente¶

In [17]:
# Retornar os estados com maior quantidade de casosAcumulados
maiores_casos = covid.sort_values(
    ["casosAcumulado"], axis=0,
    ascending=[False], inplace=True
)

maiores_casos = covid.head(3)
maiores_casos
Out[17]:
nome estado populacao latitude longitude casosAcumulado obitosAcumulado perc_casos perc_obitos
19 São Paulo SP 46649132 -22.19 -48.79 6457756 178957 13.843250 2.771195
16 Minas Gerais MG 21411923 -18.10 -44.38 4190922 65471 19.572843 1.562210
22 Rio Grande do Sul RS 11466630 -30.17 -53.50 2959192 41908 25.806989 1.416197
In [18]:
# Retornar os estados com maior quantidade de óbitos acumulados
maiores_obitos = covid.sort_values(
    ["obitosAcumulado"], axis=0,
    ascending=[False], inplace=True
)

maiores_obitos = covid.head(3)
maiores_obitos
Out[18]:
nome estado populacao latitude longitude casosAcumulado obitosAcumulado perc_casos perc_obitos
19 São Paulo SP 46649132 -22.19 -48.79 6457756 178957 13.843250 2.771195
18 Rio de Janeiro RJ 17463349 -22.25 -42.66 2745792 76817 15.723170 2.797626
16 Minas Gerais MG 21411923 -18.10 -44.38 4190922 65471 19.572843 1.562210

Gráficos¶

In [19]:
# Gráfico de linha e colunas
# Mostra a quantidade de casos e óbitos acumulados, junto com a quantidade populacional de cada estado brasileiro
fig_COP = go.Figure()

fig_COP.add_trace(go.Scatter(
    x=covid['estado'],
    y=covid['populacao'],
    name = "População",
    mode = "lines+markers",
    marker = {'color': '#C1403D'},
))

fig_COP.add_trace(go.Bar(
    x = covid['estado'],    
    y = covid['casosAcumulado'],
    name = "Casos",
    marker = {'color': '#0294A5'},
))

fig_COP.add_trace(go.Bar(
    x = covid['estado'],
    y = covid['obitosAcumulado'],
    name = "Obitos",
    marker = {'color': '#04060F'},
))

fig_COP.update_xaxes(title_text='Estados')
fig_COP.update_yaxes(title_text='População')


fig_COP.update_layout(title_text="Projeção da quantidade populacional, casos de COVID-19 e óbitos por COVID-19")

fig_COP.show()
SPRJMGPRRSBACEGOSCPEPAMTESAMDFMAMSPBRNPIROALSETORRAPAC010M20M30M40M
PopulaçãoCasosObitosProjeção da quantidade populacional, casos de COVID-19 e óbitos por COVID-19EstadosPopulação
plotly-logomark
In [20]:
# Gráfico de linha e coluna
# Esse gráfico mostra os 3 estados com maior quantidade de casos acumulados e a quantidade populacional
estados_casosM = go.Figure()

estados_casosM.add_trace(go.Scatter(
    x=maiores_casos['estado'],
    y=maiores_casos['populacao'],
    name = "População",
    mode = "lines+markers",
    marker = {'color': '#C1403D'},
))

estados_casosM.add_trace(go.Bar(
    x = maiores_casos['estado'],    
    y = maiores_casos['casosAcumulado'],
    name = "Casos",
    marker = {'color': '#0294A5'},
))


estados_casosM.update_xaxes(title_text='Estados')
estados_casosM.update_yaxes(title_text='População')


estados_casosM.update_layout(title_text="Estados com maior quantidade de casos acumulados por COVID-19 e sua população (2023)")

estados_casosM.show()
SPMGRS010M20M30M40M
PopulaçãoCasosEstados com maior quantidade de casos acumulados por COVID-19 e sua população (2023)EstadosPopulação
plotly-logomark
In [21]:
# Gráfico de barras horizontais
# Mostra os 3 estados com maior quantidade de óbitos acumulados e sua população
estados_obitosM = px.bar(maiores_obitos, x="obitosAcumulado", y="populacao", color='estado', orientation='h',
             hover_data=["obitosAcumulado", "populacao"],
             height=400,
             title='Estados com maior quantidade de óbitos acumulados por COVID-19 e sua população (2023)',
             labels={"obitosAcumulado":"Óbitos acumulados por estado", "populacao":"População por estado", "estado":"Estados Brasileiros"}
            )
estados_obitosM.show()
020k40k60k80k100k120k140k160k180k20M30M40M
Estados BrasileirosSPRJMGEstados com maior quantidade de óbitos acumulados por COVID-19 e sua população (2023)Óbitos acumulados por estadoPopulação por estado
plotly-logomark

Entendendo sobre visualização com Folium e GeoJSON¶

  • O Folium foi utilizado na construção do mapa do Brasil
  • O GeoJSON é como "uma camada" em cima da projeção do mapa, ele utiliza os dados json para criar uma demarcação do alcance territorial do país e as divisões de estados. Dessa forma, o Brasil fica destacado dos países restantes na América do Sul.

Esses trechos de código serviram como prática, para entender melhor como funcionava cada biblioteca e poder visualizar como poderia introduzir os dados em cima do mapa.

In [33]:
# Utiliza a latitude e longitude para visualizar o Brasil em um mapa mundi, aplicando o zoom para determinar uma distância na visualização.
mapa = folium.Map(location = [-15.842866484776115, -48.026985518146226], zoom_start = 4)
mapa
Out[33]:
Make this Notebook Trusted to load map: File -> Trust Notebook
In [23]:
# Utiliza a função json.load e o caminho do documento para abrir o arquivo json do IBGE.
# Você precisa substituir e colocar o caminho que está dentro do seu computador.
estados_geoJSON = json.load(open('/Users/atryl/Documents/geojson/br_states.json'))
In [24]:
# Location - recebe a latitude e longitude que deseja ser visualizada.
# width e height - altura e largura da projeção da imagem do mapa.
# zoom_start - aproximação da imagem.

# Criação do mapa
mapa = folium.Map(
    location = [-15.77972, -47.92972],
    width=600,
    height=600,
    zoom_start=3
    )

# Utiliza o Folium e GeoJSON para manipular o arquivo .json dos estados e adiciona no mapa criado.
folium.GeoJson(estados_geoJSON).add_to(mapa)

mapa
Out[24]:
Make this Notebook Trusted to load map: File -> Trust Notebook
In [25]:
# Criação do mapa
mapa = folium.Map(
    location = [-15.77972, -47.92972],
    width = 600,
    height = 600,
    zoom_start = 3
    )

# Aplicando a demarcações dos estados e adicionando modificações no estilo da visualização.
folium.GeoJson(
    estados_geoJSON, 
    style_function = lambda feature: {
        'fillColor': 'green',
        'color': 'darkgreen',
        'weight': 0.5,
    }
).add_to(mapa)

mapa
Out[25]:
Make this Notebook Trusted to load map: File -> Trust Notebook

Criando a linha de cores de indicação de quantidade¶

  • Tonalidade mais clara - valores menores
  • Tonalidade mais escura - valores maiores
In [26]:
# Função com o código da variação das cores
# A escala é definida de acordo com os valores de casos, foi utilizado o valor do AC como menor e SP como maior
colorCasos = linear.YlOrRd_09.scale(160000,6500000)
colorCasos
Out[26]:
1600001216666.72273333.33330000.04386666.75443333.36500000
In [27]:
colorObitos = linear.YlOrRd_09.scale(2000, 180000)
colorObitos
Out[27]:
200031666.761333.391000.0120666.7150333.3180000

Visualizando os dados com Folium e GeoJSON¶

In [28]:
# Gerando o mapa
mapa = folium.Map(
    location = [-15.77972, -47.92972],    
    width = 600,
    height = 600,
    zoom_start = 4
)

# Aplicando os dados json e modificando o estilo de visualização
# em 'fillColor' é utilizado o id dentro do json indicando cada estado, relacionando com os obitosAc e a paleta de cores colorObitos
folium.GeoJson(
    estados_geoJSON,
    name='Óbitos Acumulados por COVID-19 em 2023',
    style_function=lambda feature: {
        'fillColor': colorObitos(obitosAc[feature['id']]),
        'color': 'darkgrenn',
        'weight': 0.3,
    }
    
).add_to(mapa)

# Adicionando título a legenda
colorObitos.caption = 'Obitos Acumulados de Covid no Brasil por Estado (2023)'
colorObitos.add_to(mapa)

# Cria um painel de controle (nesse caso, pode selecionar se quiser visualizar os obitos Acumulados)
folium.LayerControl(collapsed = False).add_to(mapa)
mapa.save('covid_obitos_br_2023.html')

mapa
Out[28]:
Make this Notebook Trusted to load map: File -> Trust Notebook
In [29]:
# O mesmo procedimento realizado com óbitos acumulados (código acima)
# Aqui mostra a quantidade de Casos Acumulados
mapa = folium.Map(
    width = 600,
    height = 600,
    location = [-15.77972, -47.92972],
    zoom_start = 4
)

folium.GeoJson(
    estados_geoJSON,
    name='Casos Acumulados de COVID-19 em 2023',
    style_function=lambda feature: {
        'fillColor': colorCasos(casosAc[feature['id']]),
        'weight': 0.3,
    }
    
).add_to(mapa)

                        
colorCasos.caption = 'Casos Acumulados de Covid no Brasil por Estado (2023)'
colorCasos.add_to(mapa)

folium.LayerControl(collapsed = False).add_to(mapa)
mapa.save('covid_casos_br_2023.html')

mapa
Out[29]:
Make this Notebook Trusted to load map: File -> Trust Notebook

Explorando mais o Folium¶

  • Nos códigos abaixo, ainda utilizando as variáveis de casos e óbitos acumulados
  • Introduzi algumas modificações em HTML para criar as legendas e adicionar um título destaque no mapa.
  • Adicionei marcadores (os pontos no mapa) para indicar a quantidade populacional de cada estado.
  • Adicionei os clusters, para agrupar os marcadores a medida que a imagem é desaproximada e assim não poluir tanto visualmente.
In [30]:
# Introdução de mais elementos na visualização do mapa

html = 'layout_legenda.html'

def color_change(populacao):
    if(populacao > 7500000):
        return('purple')

    elif(3500000 <= populacao <7500000):
        return('orange')

    else:
        return('gray')

template = """
{% macro html(this, kwargs) %}
<!doctype html>
<html lang="utf-8">
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <title>Mapeamento dos Casos e Óbitos Acumulados por COVID-19 (2023)</title>
  <link rel="stylesheet" href="//code.jquery.com/ui/1.12.1/themes/base/jquery-ui.css">
</head>
<body>
<div id='maplegend' class='maplegend' 
    style='position: absolute; z-index:9999; border:0px; background-color:rgba(255, 255, 255, 0.8);
     border-radius:6px; padding: 10px; font-size:25px; right: 280px; bottom: 20px;'>
     
    <div class='legend-title'><font size="2">Mapeamento da COVID-19 (2023)</div>
    <div class='legend-scale'><font size="1">github.com/Atrylli</font></div>
</div>
 
<div id='maplegend' class='maplegend' 
    style='position: absolute; z-index:9999; border:2px solid white; background-color:rgba(255, 255, 255, 0.8);
     border-radius:6px; padding: 10px; font-size:15px; left: 20px; bottom: 20px;'>
     
    <div class='legend-scale'>
      <div class='legend-title'>Marcadores populacionais</div>
        <ul class='legend-labels'>
        <li><span style='background:purple;opacity:0.5;'></span>Maior que 7500000 </li>
        <li><span style='background:orange;opacity:0.5;'></span>Maior que 3500000</li>
        <li><span style='background:gray;opacity:0.5;'></span>Menor que 3500000</li>
      </ul>
    <div class='legend-title'></div>
    
</div>
</div>
 
</body>
</html>
<style type='text/css'>
  .maplegend .legend-title {
    text-align: right;
    margin-bottom: 5px;
    font-weight: bold;
    font-size: 90%;
    }
  .maplegend .legend-scale ul {
    margin: 0;
    margin-bottom: 5px;
    padding: 0;
    float: left;
    list-style: none;
    }
  .maplegend .legend-scale ul li {
    font-size: 80%;
    list-style: none;
    margin-left: 0;
    line-height: 18px;
    margin-bottom: 2px;
    }
  .maplegend ul.legend-labels li span {
    display: block;
    float: left;
    height: 16px;
    width: 30px;
    margin-right: 5px;
    margin-left: 0;
    border: 1px solid #999;
    }
  .maplegend .legend-source {
    font-size: 80%;
    color: #777;
    clear: both;
    }
  .maplegend a {
    color: #777;
    }
</style>
{% endmacro %}"""

    
mapa = folium.Map(
    width = 700,
    height = 600,
    location = [-15.77972, -47.92972],
    zoom_start = 3
)

folium.GeoJson(
    estados_geoJSON,
    name='Casos Acumulados de COVID-19 em 2023',
    style_function=lambda feature: {
        'fillColor': colorCasos(casosAc[feature['id']]),
        'color': 'darkgrenn',
        'weight': 0.3,
    }
    
).add_to(mapa)

marker_cluster = MarkerCluster(name = 'Agrupamentos por estado').add_to(mapa)

for i,row in covid.iterrows():
    folium.CircleMarker(
        (row.latitude,row.longitude), 
        radius=9, weight=1, 
        color='black',  
        popup="Quantidade Populacional: "+str(row.populacao),
        fill_color = color_change(row.populacao),
        fill_opacity=.5).add_to(marker_cluster)


macro = MacroElement()
macro._template = Template(template)

mapa.get_root().add_child(macro)

colorCasos.caption ='Casos Acumulados de Covid no Brasil por Estado (2023)'
colorCasos.add_to(mapa)


folium.LayerControl('topright',collapsed = False).add_to(mapa)
mapa.save('covid_casos_br_2023.html')

mapa
Out[30]:
Make this Notebook Trusted to load map: File -> Trust Notebook